// K 只能是 T类型中的key
// [P in K] 类似于 for in 循环;
type MyPick<T, K extends keyof T> = {
  [P in K]: T[P];
};

type User = {
  name: string;
  age: number;
  isLock: boolean;
};
// 只保留 User类型中的 age isLock
type M1 = MyPick<User, "age" | "isLock">;

// 移除对象 T 中的 K字段
type MyOmit<T, K extends keyof T> = {
  [P in Exclude<keyof T, K>]: T[P];
};
type M2 = MyOmit<User, "age" | "isLock">;

// ===>>>  Omit 和 Pick 是互补的

// Exclude<T, U>; 移除 T 中的 U
type MM = Exclude<"name" | "age", "name">;

// 去除 User类型中的 age isLock

// 数组也可以使用 P in K。且只能用在 {} 对象中
type ArrType<T extends any[]> = { [K in keyof T]: T[K] };
type A1 = ArrType<[1, 2]>;
type A2 = ArrType<[]>;
export {};
